Skip to content

Require payment for hosted (multi-user) Postcard#69

Merged
philipithomas merged 2 commits intomainfrom
require-payment-hosted-mode
Mar 12, 2026
Merged

Require payment for hosted (multi-user) Postcard#69
philipithomas merged 2 commits intomainfrom
require-payment-hosted-mode

Conversation

@philipithomas
Copy link
Copy Markdown
Contributor

Summary

  • Make hosted Postcard paid-only at $4/mo with 30-day free trial, while keeping solo/self-hosted completely free
  • Grandfather existing accounts — all current accounts are marked grandfathered: true and bypass payment requirements
  • Canceled accounts stay activeever_subscribed? check ensures no lockout after cancellation
  • Redirect new signups and unpaid returning users to Stripe Checkout (with trial) across all auth flows (email, OAuth)
  • Add PaymentRequired concern as a dashboard gate on Pages, Posts, Subscribers, and Showcase controllers
  • Replace two-tier Free/Premium pricing page with a single centered $4/mo card highlighting the 30-day free trial
  • Update homepage CTAs to "Start your free trial" / "Start free trial"
  • Fix billing link visibility for grandfathered accounts (prevents BillingController errors)
  • Update philipithomas.com URLs to philipithomas.postcard.page in welcome mailer templates
  • Add test infrastructure (test_helper, fixtures) and 6 model tests covering payment logic

Test plan

  • rails db:migrate — migration runs, existing accounts get grandfathered: true
  • rails test — all 6 new tests pass
  • Manual: In dev multiuser mode, sign up → redirected to Stripe Checkout (with trial)
  • Manual: Sign in as grandfathered account → goes straight to dashboard
  • Manual: Visit homepage → single pricing card, "$4/month", "30-day free trial"
  • Manual: Check welcome mailer templates reference philipithomas.postcard.page

🤖 Generated with Claude Code

philipithomas and others added 2 commits March 11, 2026 21:02
Make hosted Postcard paid-only ($4/mo with 30-day free trial) while
keeping solo/self-hosted completely free. Existing free accounts are
grandfathered and canceled accounts stay active (no lockout).

- Add grandfathered boolean to accounts, backfill existing as true
- Add requires_payment? and ever_subscribed? to Account model
- Add 30-day trial to Stripe checkout session
- Redirect new signups and unpaid returning users to Stripe checkout
- Add PaymentRequired concern to dashboard controllers
- Replace two-tier pricing page with single $4/mo plan + free trial
- Update CTAs to reference free trial
- Update philipithomas.com URLs to philipithomas.postcard.page
- Add test infrastructure and model tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The checkout success URL changed from page_setup_url to page_url,
which changed the brakeman fingerprint. Update the ignore entry.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@philipithomas philipithomas merged commit 8c49d09 into main Mar 12, 2026
6 of 7 checks passed
@philipithomas philipithomas deleted the require-payment-hosted-mode branch March 12, 2026 04:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant